package com.smart.community.user.service;

import java.util.Collections;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.smart.community.commons.dto.SystemLogQueryDTO;
import com.smart.community.commons.entity.SystemLog;
import com.smart.community.commons.result.PageResult;
import com.smart.community.commons.service.SystemLogService;
import com.smart.community.commons.utils.SecurityUtils;
import com.smart.community.feign.property.service.DataScopeFeign;

import lombok.extern.slf4j.Slf4j;

/**
 * 系统日志权限控制服务
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 */
@Slf4j
@Service
public class SystemLogPermissionService {
    
    @Autowired
    private SystemLogService systemLogService;
    
    @Autowired
    private DataScopeFeign dataScopeFeign;
    
    /**
     * 分页查询系统日志（带数据权限控制）
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     * @throws Exception 统一异常
     */
    public PageResult<SystemLog> getSystemLogPageWithPermission(SystemLogQueryDTO queryDTO) throws Exception {
        Long currentUserId = SecurityUtils.getCurrentUserId();
        
        // 1. 检查超级管理员权限
        Boolean isSuperAdmin = dataScopeFeign.isUserSuperAdmin(currentUserId);
        if (isSuperAdmin) {
            // 超级管理员可以查看所有日志
            log.info("超级管理员查询系统日志，用户ID：{}", currentUserId);
            return systemLogService.getSystemLogPage(queryDTO);
        }
        
        // 2. 获取用户数据权限范围
        List<Long> propertyCompanyIds = dataScopeFeign.getUserPropertyCompanyIds(currentUserId);
        if (propertyCompanyIds.isEmpty()) {
            // 用户无权限访问任何物业公司数据
            log.info("用户无物业公司权限，返回空结果，用户ID：{}", currentUserId);
            return createEmptyPageResult(queryDTO);
        }
        
        // 3. 根据多个物业公司ID查询系统日志
        log.info("物业公司用户查询系统日志，用户ID：{}，物业公司ID列表：{}", currentUserId, propertyCompanyIds);
        
        // 支持多个物业公司的日志查询
        return systemLogService.getSystemLogByPropertyCompanyIds(propertyCompanyIds, queryDTO.getCurrent(), queryDTO.getSize());
    }
    
    /**
     * 获取当前用户ID（用于缓存key）
     */
    public String getCurrentUserId() {
        try {
            return SecurityUtils.getCurrentUserId().toString();
        } catch (Exception e) {
            return "anonymous";
        }
    }
    
    /**
     * 创建空的分页结果
     */
    private PageResult<SystemLog> createEmptyPageResult(SystemLogQueryDTO queryDTO) {
        PageResult<SystemLog> result = new PageResult<>();
        result.setCurrent(queryDTO.getCurrent());
        result.setSize(queryDTO.getSize());
        result.setTotal(0L);
        result.setPages(0);
        result.setRecords(Collections.emptyList());
        return result;
    }
}
